library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 3.1.0     v purrr   0.2.5
v tibble  2.0.1     v dplyr   0.7.8
v tidyr   0.8.2     v stringr 1.3.1
v readr   1.3.1     v forcats 0.3.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(plotly)

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
library(crosstalk)

Munge Data

take dplyr::starwars and mungin it into crostalk::SharedData

sw_eye <- starwars %>% 
  filter(eye_color == str_extract(eye_color, "\\w+")) %>% 
  filter(eye_color != "unknown", eye_color != "hazel", eye_color != "white") %>% 
  filter(mass < 200) %>% 
  mutate(eye_color = fct_infreq(eye_color)) %>% 
  mutate(species = fct_rev(fct_infreq(species)))
sw_eye_levels <- levels(sw_eye$eye_color)
shared_sw_eye <- SharedData$new(sw_eye)

Build Plotly objects

vertbar <- ggplotly(shared_sw_eye %>% 
  ggplot(aes(eye_color)) +
  geom_bar())
scatter <- plot_ly(data = shared_sw_eye, x = ~mass, y = ~height, 
        color = ~eye_color, colors = sw_eye_levels,
        text = ~name, mode = "markers")   %>% 
  layout(title = "\nStarWars Character Eye Color", height = 400)
Specifying width/height in layout() is now deprecated.
Please specify in ggplotly() or plot_ly()
horbar <- ggplotly(ggplot(shared_sw_eye, aes(x = species)) + geom_bar() + coord_flip())
subplot(vertbar, scatter)
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
Can only have one: config
subplot(scatter, horbar, nrows = 2)
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
Can only have one: config

linking & Brushing w/o Shiny

Selection: Transient v persistent

sd <- SharedData$new(txhousing, ~city)
p <- ggplot(sd, aes(date, median)) + geom_line()
gg <- ggplotly(p, tooltip = "city")
# Persistent mode can still be enabled in this case by holding the
# shift key when hovering over lines
bscols(highlight(gg, on = "plotly_hover", dynamic = TRUE),
# Persistent mode can be set permanently like so
highlight(gg, on = "plotly_hover", dynamic = TRUE, persistent = TRUE))
Adding more colors to the selection color palette.
Adding more colors to the selection color palette.
We recommend setting `persistent` to `FALSE` (the default) because persistent selection mode can now be used by holding the shift key (while triggering the `on` event).
Setting the `off` event (i.e., 'plotly_doubleclick') to match the `on` event (i.e., 'plotly_hover'). You can change this default via the `highlight()` function.
Setting the `off` event (i.e., 'plotly_doubleclick') to match the `on` event (i.e., 'plotly_hover'). You can change this default via the `highlight()` function.
Setting the `off` event (i.e., 'plotly_doubleclick') to match the `on` event (i.e., 'plotly_hover'). You can change this default via the `highlight()` function.
Setting the `off` event (i.e., 'plotly_doubleclick') to match the `on` event (i.e., 'plotly_hover'). You can change this default via the `highlight()` function.
LS0tDQp0aXRsZTogInBsb3RseSAtIGxpbmtpbmcgd2l0aG91dCBzaGlueSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCi0gW2xpbmtpbmcgd2l0aG91dCBzaGlueV0oaHR0cHM6Ly9wbG90bHktYm9vay5jcHNpZXZlcnQubWUvbGlua2luZy12aWV3cy13aXRob3V0LXNoaW55Lmh0bWwjbGlua2luZy12aWV3cy13aXRob3V0LXNoaW55KQ0KLSBbc3VicGxvdHNdKGh0dHBzOi8vcGxvdGx5LWJvb2suY3BzaWV2ZXJ0Lm1lL21lcmdpbmctcGxvdGx5LW9iamVjdHMuaHRtbCkgLS0gbWVyZ2luZyBtdWx0aXBsZSBwbG90bHkgb2JqZWN0cw0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGNyb3NzdGFsaykNCmBgYA0KDQojIyBNdW5nZSBEYXRhDQoNCnRha2UgYGRwbHlyOjpzdGFyd2Fyc2AgYW5kIG11bmdpbiBpdCBpbnRvIGBjcm9zdGFsazo6U2hhcmVkRGF0YWANCg0KYGBge3J9DQpzd19leWUgPC0gc3RhcndhcnMgJT4lIA0KICBmaWx0ZXIoZXllX2NvbG9yID09IHN0cl9leHRyYWN0KGV5ZV9jb2xvciwgIlxcdysiKSkgJT4lIA0KICBmaWx0ZXIoZXllX2NvbG9yICE9ICJ1bmtub3duIiwgZXllX2NvbG9yICE9ICJoYXplbCIsIGV5ZV9jb2xvciAhPSAid2hpdGUiKSAlPiUgDQogIGZpbHRlcihtYXNzIDwgMjAwKSAlPiUgDQogIG11dGF0ZShleWVfY29sb3IgPSBmY3RfaW5mcmVxKGV5ZV9jb2xvcikpICU+JSANCiAgbXV0YXRlKHNwZWNpZXMgPSBmY3RfcmV2KGZjdF9pbmZyZXEoc3BlY2llcykpKQ0KDQpzd19leWVfbGV2ZWxzIDwtIGxldmVscyhzd19leWUkZXllX2NvbG9yKQ0KDQpzaGFyZWRfc3dfZXllIDwtIFNoYXJlZERhdGEkbmV3KHN3X2V5ZSkNCmBgYA0KDQojIyAgQnVpbGQgUGxvdGx5IG9iamVjdHMNCg0KYGBge3J9DQp2ZXJ0YmFyIDwtIGdncGxvdGx5KHNoYXJlZF9zd19leWUgJT4lIA0KICBnZ3Bsb3QoYWVzKGV5ZV9jb2xvcikpICsNCiAgZ2VvbV9iYXIoKSkNCg0Kc2NhdHRlciA8LSBwbG90X2x5KGRhdGEgPSBzaGFyZWRfc3dfZXllLCB4ID0gfm1hc3MsIHkgPSB+aGVpZ2h0LCANCiAgICAgICAgY29sb3IgPSB+ZXllX2NvbG9yLCBjb2xvcnMgPSBzd19leWVfbGV2ZWxzLA0KICAgICAgICB0ZXh0ID0gfm5hbWUsIG1vZGUgPSAibWFya2VycyIpICAgJT4lIA0KICBsYXlvdXQodGl0bGUgPSAiXG5TdGFyV2FycyBDaGFyYWN0ZXIgRXllIENvbG9yIiwgaGVpZ2h0ID0gNDAwKQ0KDQpob3JiYXIgPC0gZ2dwbG90bHkoZ2dwbG90KHNoYXJlZF9zd19leWUsIGFlcyh4ID0gc3BlY2llcykpICsgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKSkNCmBgYA0KDQoNCg0KYGBge3J9DQoNCnN1YnBsb3QodmVydGJhciwgc2NhdHRlcikNCg0KYGBgDQoNCmBgYHtyfQ0Kc3VicGxvdChzY2F0dGVyLCBob3JiYXIsIG5yb3dzID0gMikNCmBgYA0KDQojIyBsaW5raW5nICYgQnJ1c2hpbmcgdy9vIFNoaW55DQoNCioqU2VsZWN0aW9uKio6IFtUcmFuc2llbnQgdiBwZXJzaXN0ZW50XShodHRwczovL3Bsb3RseS1ib29rLmNwc2lldmVydC5tZS9saW5raW5nLXZpZXdzLXdpdGhvdXQtc2hpbnkuaHRtbCN0cmFuc2llbnQtdmVyc3VzLXBlcnNpc3RlbnQtc2VsZWN0aW9uKQ0KDQoNCmBgYHtyfQ0Kc2QgPC0gU2hhcmVkRGF0YSRuZXcodHhob3VzaW5nLCB+Y2l0eSkNCnAgPC0gZ2dwbG90KHNkLCBhZXMoZGF0ZSwgbWVkaWFuKSkgKyBnZW9tX2xpbmUoKQ0KZ2cgPC0gZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJjaXR5IikNCg0KIyBQZXJzaXN0ZW50IG1vZGUgY2FuIHN0aWxsIGJlIGVuYWJsZWQgaW4gdGhpcyBjYXNlIGJ5IGhvbGRpbmcgdGhlDQojIHNoaWZ0IGtleSB3aGVuIGhvdmVyaW5nIG92ZXIgbGluZXMNCg0KYnNjb2xzKGhpZ2hsaWdodChnZywgb24gPSAicGxvdGx5X2hvdmVyIiwgZHluYW1pYyA9IFRSVUUpLA0KDQojIFBlcnNpc3RlbnQgbW9kZSBjYW4gYmUgc2V0IHBlcm1hbmVudGx5IGxpa2Ugc28NCmhpZ2hsaWdodChnZywgb24gPSAicGxvdGx5X2hvdmVyIiwgZHluYW1pYyA9IFRSVUUsIHBlcnNpc3RlbnQgPSBUUlVFKSkNCmBgYA0KDQoNCg==